/**
 * @file soft_I2C.h
 * @author your name (you@domain.com)
 * @brief 软件I2C
 * @version 0.1
 * @date 2025-05-12
 * 
 * @copyright Copyright (c) 2025
 * 
 * @note //根据你的单片机修改IO口的输入输出的相关内容！
 */

#pragma once


#ifdef __cplusplus
extern "C" {
#endif

#include <stdbool.h>

#include "gpio.h"//根据你的单片机修改IO口的输入输出的相关内容！
#include "soft_delay.h"



/**
 * @brief 保存某个I2C总线使用的端口引脚信息
 * 
 */
typedef struct
{
    GPIO_TypeDef* SCL_Port; //时钟线端口
    uint32_t SCL_Pin;       //时钟线引脚
    GPIO_TypeDef* SDA_Port; //数据线端口
    uint32_t SDA_Pin;       //数据线引脚
}Soft_I2C_Handle;

/**
 * @brief 设置软件I2c使用的端口和引脚
 * 
 * @param si2c 指向Soft_I2C_Handle结构体的指针，该结构体包含指定软件I2C的配置信息。
 * @param scl_port 时钟线端口
 * @param scl_pin 时钟线引脚
 * @param sda_port 数据线端口
 * @param sda_pin 数据线引脚
 */
void Soft_I2C_Config(Soft_I2C_Handle* si2c, GPIO_TypeDef* scl_port, uint32_t scl_pin, GPIO_TypeDef* sda_port, uint32_t sda_pin);

/**
 * @brief 软件I2C以主模式发送一定数量的数据。
 * 
 * @param si2c 指向Soft_I2C_Handle结构体的指针，该结构体包含指定软件I2C的配置信息。
 * @param DevAddress 目标设备地址：在调用接口之前，必须将数据表中的设备7位地址值左移1位
 * @param pData 指向数据缓冲区的指针
 * @param Size 要发送的数据量
 * @return true 成功
 * @return false 失败
 */
bool Soft_I2C_Master_Transmit(Soft_I2C_Handle* si2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);

/**
 * @brief 软件I2C以主模式接收一定数量的数据。
 * 
 * @param si2c 指向Soft_I2C_Handle结构体的指针，该结构体包含指定软件I2C的配置信息。
 * @param DevAddress 目标设备地址：在调用接口之前，必须将数据表中的设备7位地址值左移1位
 * @param pData 指向数据缓冲区的指针
 * @param Size 要发送的数据量
 * @return true 成功
 * @return false 失败
 */
bool Soft_I2C_Master_Receive(Soft_I2C_Handle* si2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);



#ifdef __cplusplus
}
#endif